package com.zpz.framework.zpzoauth.common.utils;

import com.github.pagehelper.PageInfo;

import java.util.ArrayList;
import java.util.List;
/**
 * @author zhangpanzhi
 * @time 2019-07-09
 * @description 未经本人允许请勿随便改动，尊重劳动
 * */
public class ZpzOauthBeanUtils {

//	private static final Logger logger = LoggerFactory
//			.getLogger(BeanUtils.class);

//	/**
//	 * 利用反射实现对象之间属性复制
//	 * @param from
//	 * @param to
//	 */
//	public static void copyPropertiesByReflect(Object to, Object from)
//			throws Exception {
//		copyPropertiesExclude(to, from, null);
//	}
//
//	/**
//	 * 复制对象属性
//	 * @param from
//	 * @param to
//	 * @param excludsArray 排除属性列表
//	 * @throws Exception
//	 */
//	public static void copyPropertiesExclude(Object to, Object from,
//			String[] excludsArray) throws Exception {
//		List<String> excludesList = null;
//		if (excludsArray != null && excludsArray.length > 0) {
//			excludesList = Arrays.asList(excludsArray); // 构造列表对象
//		}
//		Method[] fromMethods = from.getClass().getDeclaredMethods();
//		Method[] toMethods = to.getClass().getDeclaredMethods();
//		Method fromMethod = null, toMethod = null;
//		String fromMethodName = null, toMethodName = null;
//		for (int i = 0; i < fromMethods.length; i++) {
//			fromMethod = fromMethods[i];
//			fromMethodName = fromMethod.getName();
//			if (!fromMethodName.contains("get"))
//				continue;
//			// 排除列表检测
//			String str = fromMethodName.substring(3);
//			if (excludesList != null
//					&& excludesList.contains(str.substring(0, 1).toLowerCase()
//							+ str.substring(1))) {
//				continue;
//			}
//			toMethodName = "set" + fromMethodName.substring(3);
//			toMethod = findMethodByName(toMethods, toMethodName);
//			if (toMethod == null)
//				continue;
//			Object value = fromMethod.invoke(from, new Object[0]);
//			if (value == null)
//				continue;
//			// 集合类判空处理
//			if (value instanceof Collection) {
//				Collection newValue = (Collection) value;
//				if (newValue.size() <= 0)
//					continue;
//			}
//			toMethod.invoke(to, new Object[] { value });
//		}
//	}
//
//	/**
//	 * 对象属性值复制，仅复制指定名称的属性值
//	 * @param from
//	 * @param to
//	 * @param includsArray
//	 * @throws Exception
//	 */
//	public static void copyPropertiesInclude(Object to, Object from,
//			String[] includsArray) throws Exception {
//		List<String> includesList = null;
//		if (includsArray != null && includsArray.length > 0) {
//			includesList = Arrays.asList(includsArray); // 构造列表对象
//		} else {
//			return;
//		}
//		Method[] fromMethods = from.getClass().getDeclaredMethods();
//		Method[] toMethods = to.getClass().getDeclaredMethods();
//		Method fromMethod = null, toMethod = null;
//		String fromMethodName = null, toMethodName = null;
//		for (int i = 0; i < fromMethods.length; i++) {
//			fromMethod = fromMethods[i];
//			fromMethodName = fromMethod.getName();
//			if (!fromMethodName.contains("get"))
//				continue;
//			// 排除列表检测
//			String str = fromMethodName.substring(3);
//			if (!includesList.contains(str.substring(0, 1).toLowerCase()
//					+ str.substring(1))) {
//				continue;
//			}
//			toMethodName = "set" + fromMethodName.substring(3);
//			toMethod = findMethodByName(toMethods, toMethodName);
//			if (toMethod == null)
//				continue;
//			Object value = fromMethod.invoke(from, new Object[0]);
//			if (value == null)
//				continue;
//			// 集合类判空处理
//			if (value instanceof Collection) {
//				Collection newValue = (Collection) value;
//				if (newValue.size() <= 0)
//					continue;
//			}
//			toMethod.invoke(to, new Object[] { value });
//		}
//	}
//
//	/**
//	 * 从方法数组中获取指定名称的方法
//	 * @param methods
//	 * @param name
//	 * @return
//	 */
//	public static Method findMethodByName(Method[] methods, String name) {
//		for (int j = 0; j < methods.length; j++) {
//			if (methods[j].getName().equals(name))
//				return methods[j];
//		}
//		return null;
//	}

	/**
	 * springframework copy method
	 * @author zhangpanzhi 2018年1月11日
	 * @param source
	 * @param target
	 */
	public static void copyProperties(Object source, Object target) {
		org.springframework.beans.BeanUtils.copyProperties(source, target);
	}

	/**
	 * 拷贝分页PageInfo类到响应PageInfo类
	 * @author zhangpanzhi 2018年5月16日
	 * @param page 查询的PageInfo
	 * @param respEntity 响应实体类
	 *
	 * @return pageResp 响应PageInfo
	 * @throws Exception
	 */
	public static <T, K> PageInfo<T> copyPageInfoProperties(PageInfo<K> page,
			Class<T> respEntity) throws Exception{
		PageInfo<T> pageResp = new PageInfo<T>();
		ZpzOauthBeanUtils.copyProperties(page, pageResp);
		List<T> resps=new ArrayList<>();
		for(K select:page.getList()){
			T resp=respEntity.newInstance();
			ZpzOauthBeanUtils.copyProperties(select, resp);
			resps.add(resp);
		}
		pageResp.setList(resps);
		return pageResp;
	}

	/**
	 * 拷贝查询的List类到响应的List类
	 * @author zhangpanzhi 2018年5月16日
	 * @param selectList 查询的List
	 * @param respEntity 响应实体类
	 *
	 * @return respList 响应的List
	 * @throws Exception
	 */
	public static <T, K> List<K> copyListProperties(List<T> selectList,Class<K> respEntity)
			throws Exception{
		List<K> resps=new ArrayList<>();
		if(!selectList.isEmpty()){
			for(T select:selectList){
				K resp=respEntity.newInstance();
				ZpzOauthBeanUtils.copyProperties(select, resp);
				resps.add(resp);
			}
		}
		return resps;
	}

}
